package com.my.boot.config;

import com.my.boot.bean.Pet;
import com.my.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhupanlin
 * @version 1.0
 * @description: TODO
 * @date 2023/11/5 9:47
 */

/**
 * 1. 配置类里面使用@Bean标注在方法上给容器注册组件，默认也是单实例的
 * 2. 配置类本身也是容器中的一个组件
 * 3. proxyBeanMethods：代理bean的方法，如果为true，在调用该组件的方法时，SpringBoot总会检查这个组件是否在容器中存在
 *      保证组件单实例，如果为false，每次调用都会返回new 出来的对象，多例。
 *      Full (proxyBeanMethods = true) 从IOC容器中取
 *      Lite (proxyBeanMethods = false) 每次获取都要new
 * 4. @Conditional：条件注解，当条件满足时，bean才会被注册
 * 5. @EnableConfigurationProperties(Car.class)
 *      - 开启Car配置绑定功能
 *      - 把Car这个组件自动注册到容器中
 *      - 方便把第三方jar注册到容器中
 */
@Configuration  // 告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

    /**
     * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册在容器中的单实例对象
     * @return
     */
    @Bean //给容器中添加组件，以方法名作为组件的id。返回类型：组件类型。返回的值：就是组件在容器中的实例
    @ConditionalOnBean(name = "cat")
    public User user01(){
        return new User("zhangsan", 18);
    }

    @Bean
    public Pet cat(){
        return new Pet("helloKity",2);
    }

}
